﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.Generic;
using PdfSharp.Drawing;

namespace VAdvantage.Print
{
    public class TextRenderer
    {
        public TextRenderer()
        {
            Alphabets.Add("A");
            Alphabets.Add("B");
            Alphabets.Add("C");
            Alphabets.Add("D");
            Alphabets.Add("E");
            Alphabets.Add("F");
            Alphabets.Add("G");
            Alphabets.Add("H");
            Alphabets.Add("I");
            Alphabets.Add("J");
            Alphabets.Add("K");
            Alphabets.Add("L");
            Alphabets.Add("M");
            Alphabets.Add("N");
            Alphabets.Add("O");
            Alphabets.Add("P");
            Alphabets.Add("Q");
            Alphabets.Add("R");
            Alphabets.Add("S");
            Alphabets.Add("T");
            Alphabets.Add("U");
            Alphabets.Add("V");
            Alphabets.Add("W");
            Alphabets.Add("X");
            Alphabets.Add("Y");
            Alphabets.Add("Z");

            //small letters
            Alphabets.Add("a");
            Alphabets.Add("b");
            Alphabets.Add("c");
            Alphabets.Add("d");
            Alphabets.Add("e");
            Alphabets.Add("f");
            Alphabets.Add("g");
            Alphabets.Add("h");
            Alphabets.Add("i");
            Alphabets.Add("j");
            Alphabets.Add("k");
            Alphabets.Add("l");
            Alphabets.Add("m");
            Alphabets.Add("n");
            Alphabets.Add("o");
            Alphabets.Add("p");
            Alphabets.Add("q");
            Alphabets.Add("r");
            Alphabets.Add("s");
            Alphabets.Add("t");
            Alphabets.Add("u");
            Alphabets.Add("v");
            Alphabets.Add("w");
            Alphabets.Add("x");
            Alphabets.Add("y");
            Alphabets.Add("z");

            Alphabets.Add("1");
            Alphabets.Add("2");
            Alphabets.Add("3");
            Alphabets.Add("4");
            Alphabets.Add("5");
            Alphabets.Add("6");
            Alphabets.Add("7");
            Alphabets.Add("8");
            Alphabets.Add("9");
            Alphabets.Add("0");

            Alphabets.Add("~");
            Alphabets.Add("!");
            Alphabets.Add("@");
            Alphabets.Add("#");
            Alphabets.Add("$");
            Alphabets.Add("%");
            Alphabets.Add("^");
            Alphabets.Add("&");
            Alphabets.Add("*");
            Alphabets.Add("(");
            Alphabets.Add(")");
            Alphabets.Add("_");
            Alphabets.Add("+");
            Alphabets.Add("|");
            Alphabets.Add("`");
            Alphabets.Add("-");
            Alphabets.Add("=");
            Alphabets.Add("<");
            Alphabets.Add(">");
            Alphabets.Add("?");
            Alphabets.Add(",");
            Alphabets.Add(".");
            Alphabets.Add("/");
            Alphabets.Add("\\");
            Alphabets.Add(";");
            Alphabets.Add("'");
            Alphabets.Add(":");
            Alphabets.Add("[");
            Alphabets.Add("]");
            Alphabets.Add("{");
            Alphabets.Add("}");
            Alphabets.Add("\"");
            Alphabets.Add(" ");
            Alphabets.Add("\t");
            Alphabets.Add("\n");
        }

        //Contains all the possible alphabets
        List<String> Alphabets = new List<string>();

        #region Font size for sansserif font
        double[] Sansserif9 = 
        {
            6.15333318710327,6.17000007629395,6.28333330154419,
            6.93333339691162,5.69000005722046,5.17333316802979,6.98000001907349,6.76333332061768,3.78666663169861,
            4.09000015258789,6.23666667938232,5.01000022888184,7.58333349227905,6.73333311080933,7.08333349227905,
            5.42666673660278,7.08333349227905,6.25666666030884,6.15333318710327,5.54666662216187,6.58666658401489,
            6.15333318710327,8.89999961853027,6.16666650772095,5.53666687011719,6.16666650772095,5.40666675567627,
            5.60666656494141,4.69000005722046,5.60666656494141,5.3600001335144,3.16333341598511,5.60666656494141,
            5.6966667175293,2.47000002861023,3.09666657447815,5.32666683197021,2.47000002861023,8.75333309173584,
            5.6966667175293,5.46333312988281,5.60666656494141,5.60666656494141,3.83999991416931,4.69000005722046,
            3.54666662216187,5.6966667175293,5.32666683197021,7.36666679382324,5.32666683197021,5.32666683197021,
            4.73000001907349,5.72333335876465,5.72333335876465,5.72333335876465,5.72333335876465,5.72333335876465,
            5.72333335876465,5.72333335876465,5.72333335876465,5.72333335876465,5.72333335876465,7.36666679382324,
            3.54333329200745,9,7.36666679382324,5.72333335876465,9.68666648864746,7.36666679382324,6.53999996185303,
            5.72333335876465,4.08666658401489,4.08666658401489,5.72333335876465,7.36666679382324,4.08666658401489,
            5.72333335876465,4.08666658401489,7.36666679382324,7.36666679382324,7.36666679382324,4.90999984741211,
            3.27333331108093,3.27333331108093,4.08666658401489,4.08666658401489,4.08666658401489,2.41666674613953,
            4.08666658401489,4.08666658401489,4.08666658401489,5.71333312988281,5.71333312988281,4.13000011444092,
            3.16333341598511,9.0, 0.0033333334140479565
        };

        double[] Sansserif10 = 
        {
            6.83666658401489,6.85666656494141,6.98333311080933,7.70666646957397,6.32333326339722,
            5.746666431427,7.753333568573,7.51333332061768,4.21000003814697,4.54666662216187,6.92999982833862,
            5.56666660308838,8.42666625976563,7.48000001907349,7.86999988555908,6.03000020980835,
            7.86999988555908,6.95333337783813,6.83666658401489,6.16333341598511,7.32000017166138,
            6.83666658401489,9.8866662979126,6.84999990463257,6.15333318710327,6.84999990463257,
            6.00666666030884,6.23000001907349,5.21000003814697,6.23000001907349,5.95666646957397,
            3.51666665077209,6.23000001907349,6.32666683197021,2.74333333969116,3.44333338737488,
            5.91666650772095,2.74333333969116,9.72666645050049,6.32666683197021,6.07000017166138,
            6.23000001907349,6.23000001907349,4.26666688919067,5.21000003814697,3.94000005722046,
            6.32666683197021,5.91666650772095,8.18333339691162,5.91666650772095,5.91666650772095,
            5.253333568573,6.35666656494141,6.35666656494141,6.35666656494141,6.35666656494141,
            6.35666656494141,6.35666656494141,6.35666656494141,6.35666656494141,6.35666656494141,
            6.35666656494141,8.18333339691162,3.93666672706604,10,8.18333339691162,6.35666656494141,
            10.7633333206177,8.18333339691162,7.26666688919067,6.35666656494141,4.53999996185303,
            4.53999996185303,6.35666656494141,8.18333339691162,4.53999996185303,6.35666656494141,
            4.53999996185303,8.18333339691162,8.18333339691162,8.18333339691162,5.45333337783813,
            3.63666677474976,3.63666677474976,4.53999996185303,4.53999996185303,4.53999996185303,
            2.68666672706604,4.53999996185303,4.53999996185303,4.53999996185303,6.34666681289673,
            6.34666681289673,4.59000015258789,3.51666665077209,10.0, 0.0033333334140479565
        };

        double[] Sansserif11 =
        {
            //caps
            7.51999998092651,7.53999996185303,7.67999982833862,8.47666645050049,6.95666646957397,
            6.32333326339722,8.52999973297119,8.26666641235352,4.63000011444092,5.0,7.61999988555908,
            6.12333345413208,9.27000045776367,8.22999954223633,8.65666675567627,6.63333320617676,
            8.65666675567627,7.65000009536743,7.51999998092651,6.77666664123535,8.05000019073486,
            7.51999998092651,10.8766670227051,7.53666687011719,6.76666688919067,7.53666687011719,
            //small
            6.60666656494141,6.85333347320557,5.73000001907349,6.85333347320557,6.5533332824707,
            3.86666655540466,6.85333347320557,6.96000003814697,3.01999998092651,3.78666663169861,
            6.51000022888184,3.01999998092651,10.6999998092651,6.96000003814697,6.67666673660278,
            6.85333347320557,6.85333347320557,4.6933331489563,5.73000001907349,4.33333349227905,
            6.96000003814697,6.51000022888184,9.00333309173584,6.51000022888184,6.51000022888184,
            5.78000020980835,
            //numbers
            6.99333333969116,6.99333333969116,6.99333333969116,6.99333333969116,6.99333333969116,
            6.99333333969116,6.99333333969116,6.99333333969116,6.99333333969116,6.99333333969116,
            //special chars
            9.00333309173584,4.32999992370605,11,9.00333309173584,6.99333333969116,11.8366670608521,
            9.00333309173584,7.99333333969116,6.99333333969116,4.996666431427,4.996666431427,
            6.99333333969116,9.00333309173584,4.996666431427,6.99333333969116,4.996666431427,
            9.00333309173584,9.00333309173584,9.00333309173584,6,4,4,4.996666431427,4.996666431427,
            4.996666431427,2.95333337783813,4.996666431427,4.996666431427,4.996666431427,6.98333311080933,
            6.98333311080933,5.0500001907348633,3.8666665554046631,11.0, 0.0033333334140479565
        };

        double[] Sansserif12 = 
        {
            8.20333290100098,8.22666645050049,8.38000011444092,
            9.24666690826416,7.58666658401489,6.89666652679443,9.3033332824707,9.01666641235352,5.05000019073486,
            5.45666646957397,8.31333351135254,6.67999982833862,10.1133337020874,8.97666645050049,9.4466667175293,
            7.23666667938232,9.4466667175293,8.34333324432373,8.20333290100098,7.39333343505859,8.78333377838135,
            8.20333290100098,11.8666667938232,8.22000026702881,7.38333320617676,8.22000026702881,7.20666646957397,
            7.47666645050049,6.253333568573,7.47666645050049,7.15000009536743,4.21999979019165,7.47666645050049,
            7.59333324432373,3.29333329200745,4.13000011444092,7.09999990463257,3.29333329200745,11.6733331680298,
            7.59333324432373,7.28333330154419,7.47666645050049,7.47666645050049,5.11999988555908,6.253333568573,
            4.73000001907349,7.59333324432373,7.09999990463257,9.81999969482422,7.09999990463257,7.09999990463257,
            6.3033332824707,7.63000011444092,7.63000011444092,7.63000011444092,7.63000011444092,7.63000011444092,
            7.63000011444092,7.63000011444092,7.63000011444092,7.63000011444092,7.63000011444092,9.81999969482422,
            4.72333335876465,12,9.81999969482422,7.63000011444092,12.9133329391479,9.81999969482422,8.72000026702881,
            7.63000011444092,5.44999980926514,5.44999980926514,7.63000011444092,9.81999969482422,5.44999980926514,
            7.63000011444092,5.44999980926514,9.81999969482422,9.81999969482422,9.81999969482422,6.54333353042603,
            4.36666679382324,4.36666679382324,5.44999980926514,5.44999980926514,5.44999980926514,3.22333335876465,
            5.44999980926514,5.44999980926514,5.44999980926514,7.61666679382324,7.61666679382324,5.50666666030884,
            4.21999979019165,12.0, 0.0033333334140479565
        };


        double[] Sansserif13 = 
        {
            8.8866662979126,8.91333293914795,9.07666683197021,10.0166664123535,8.22000026702881,7.46999979019165,
            10.0799999237061,9.77000045776367,5.47333335876465,5.90999984741211,9.006667137146,7.23666667938232,
            10.9566669464111,9.72333335876465,10.2333335876465,7.84000015258789,10.2333335876465,9.03999996185303,
            8.8866662979126,8.01000022888184,9.51666641235352,8.8866662979126,12.8533334732056,8.90666675567627,
            7.996666431427,8.90666675567627,7.8066668510437,8.10000038146973,6.77333354949951,8.10000038146973,
            7.74333333969116,4.57000017166138,8.10000038146973,8.22666645050049,3.56666660308838,4.47666645050049,
            7.6933331489563,3.56666660308838,12.6433334350586,8.22666645050049,7.8899998664856,8.10000038146973,
            8.10000038146973,5.54666662216187,6.77333354949951,5.12333345413208,8.22666645050049,7.6933331489563,
            10.6400003433228,7.6933331489563,7.6933331489563,6.82999992370605,8.26333332061768,8.26333332061768,
            8.26333332061768,8.26333332061768,8.26333332061768,8.26333332061768,8.26333332061768,8.26333332061768,
            8.26333332061768,8.26333332061768,10.6400003433228,5.11666679382324,13,10.6400003433228,8.26333332061768,
            13.9899997711182,10.6400003433228,9.4466667175293,8.26333332061768,5.90333318710327,5.90333318710327,
            8.26333332061768,10.6400003433228,5.90333318710327,8.26333332061768,5.90333318710327,10.6400003433228,
            10.6400003433228,10.6400003433228,7.09000015258789,4.73000001907349,4.73000001907349,5.90333318710327,
            5.90333318710327,5.90333318710327,3.49000000953674,5.90333318710327,5.90333318710327,5.90333318710327,
            8.25333309173584,8.25333309173584,5.96666669845581,4.57000017166138,13,0.00333333341404796
        };
        #endregion

        double mNewLineHeight_9 = 26.181819915771484;
        double mNewLineHeight_10 = 29.090909957885742;
        double mNewLineHeight_11 = 32.0;
        double mNewLineHeight_12 = 34.909091949462891;
        double mNewLineHeight_13 = 37.818183898925781;
        /// <summary>
        /// Measure the Text to calculate the final width
        /// </summary>
        /// <param name="text">Text in string form to measured</param>
        /// <param name="font">Font to be used to measure the text</param>
        public XSize MeasureText(string text, XFont font)
        {
            double width = 0.0;
            double height = 0.0;

            try
            {

                for (int i = 0; i <= text.Length - 1; i++)
                {
                    try
                    {
                        string s = text.Substring(i, 1);
                        int index = Alphabets.IndexOf(s);
                        if (font.Size == 9)
                        {
                            width += Sansserif9[index];
                            height = 13.0900001525879;
                            if (s.Equals("\n"))
                                height = mNewLineHeight_9;
                        }
                        else if (font.Size == 10)
                        {
                            width += Sansserif10[index];
                            height = 14.546667098999;
                            if (s.Equals("\n"))
                                height = mNewLineHeight_10;
                        }
                        else if (font.Size == 11)
                        {
                            width += Sansserif11[index];
                            height = 16.0;
                            if (s.Equals("\n"))
                                height = mNewLineHeight_11;
                        }
                        else if (font.Size == 12)
                        {
                            width += Sansserif12[index];
                            height = 17.453332901001;
                            if (s.Equals("\n"))
                                height = mNewLineHeight_12;
                        }
                        else if (font.Size == 13)
                        {
                            width += Sansserif13[index];
                            height = 18.909999847412109;
                            if (s.Equals("\n"))
                                height = mNewLineHeight_12;
                        }
                    }
                    catch
                    {
                    }
                }
            }
            catch
            {
            }

            return new XSize(width, height);
        }

    }
}
